<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	<script type="text/javascript">
		
		
		var declaration;
		console.log(declaration); //在 JavaScript 中，新创建的变量的默认值都是 undefined
		declaration = 'This is an initialization'
		console.log(declaration);
		
		/* 
			JavaScript 的世界共有两种作用域：全局作用域和方法作用域
			使用 var 声明的变量的作用域是方法作用域，如下 date 变量在方法外面不可访问的
		 */
		function getDate() {
			var date = new Date();
			return date;
		}
		
		getDate();
		// console.log(date); // Uncaught ReferenceError: date is not defined
		
		/* 
			var 变量关键字的真正问题在于:
			其在方法内部的定义变量开始的任何地方都可以访问到这个变量
			
			如下所示:
				i、discountedPrice、finalPrice这三个变量是定义在一个for循环体中的（即位于块作用域中）
				按照正常思维来讲，在循环结束后，这三个变量是不可访问的
				但是现在在这个整个大的方法中，依然是可以访问的
				
				var 和 let 第一点不同就是 let 是块作用域，即其在整个大括号 {} 之内可见。如果使用 let 来重写上面的 for 循环的话会报错:
				i is not defined
				
				let 和 var 的第二点不同是，在变量声明之前就访问变量的话，会直接提示 ReferenceError，而不像 var 那样使用默认值 undefined:
				
				const 和 let 的作用域是一致的，不同的是 const 变量一旦被赋值，就不能再改变了
		 */
		function discountedPrices(prices, discount) {
			console.log(discounted); // 变量声明之前访问
			var discounted = [];
			for(var i = 0; i < prices.length; i++) {
				var discountedPrice = prices[i] * (1 - discount);
				var finalPrice = Math.round(discountedPrice * 100) / 100;
				discounted.push(finalPrice);
			}				
			console.log(i);
			console.log(discountedPrice);
			console.log(finalPrice);
			return discounted;
		}
		discountedPrices([0,1,2,3,4,5,6,7,8,9], 0);
		
		/**
		 * const 和 let 的作用域是一致的，不同的是 const 变量一旦被赋值，就不能再改变了,否则会报错:Assignment to constant variable
		 * 
		 * 但是这并不意味着使用 const 声明的变量本身不可变，只是说它不可被再次赋值了
		 */
		const userName = '轩辕冰烆';
		let userAge = 18;
		userAge = 28;
		console.log(userAge);
		// userName = '易扬宇';
		console.log(userName);
		
		const person = {userName :'张三丰'};
		person.userName = '张君宝'; // 正确的
		person = {userName: '张君宝'}; // 错误的
		console.log(JSON.stringify(person));
		
		/**
		 * 使用场景建议：
		 * 大多数情况下都使用 const，除非你知道你的变量的值还会被改变，这样的话，别人阅读你的代码不用老想着这个变量的值会不会有改变。
		 * 如果这个变量的值的确需要改变，例如在 for 循环里面，那么就是用 let。这也同时意味着你以后就不要用 var 了
		 * 
		 * 关于 const 的使用，一些程序员还倾向于只用来声明常量，其它情况下一律使用 let 关键字，我觉得这样也是可行的
		 */
	</script>
	</body>
</html>
